package TCP.Demo3;

// FileUploadClient.java

import java.io.*;

import java.net.*;

import java.util.Scanner;

/**

 * 文件上传客户端

 * 基于TCP协议实现文件上传功能

 */

public class FileUploadClient {

    // 服务器主机名

    private static final String SERVER_HOST = "192.168.110.29";

    // 服务器端口号

    private static final int SERVER_PORT = 61012;


    public static void main(String[] args) {

        try (Scanner scanner = new Scanner(System.in)) {

            System.out.println("TCP文件上传客户端");

            System.out.print("请输入要上传的文件路径: ");

            // 读取用户输入的文件路径

            String filePath = scanner.nextLine();



            // 创建文件对象并检查文件是否存在且为普通文件

            File file = new File(filePath);

            if (!file.exists() || !file.isFile()) {

                System.out.println("错误: 文件不存在或不是有效文件");

                return;

            }



            try (

                    // 创建TCP套接字并连接到服务器

                    Socket socket = new Socket(SERVER_HOST, SERVER_PORT);

                    // 创建数据输出流，用于向服务器发送数据

                    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

                    // 创建文件输入流，用于读取本地文件

                    FileInputStream fis = new FileInputStream(file)

            ) {

                // 发送文件名到服务器（使用UTF-8编码）

                dos.writeUTF(file.getName());

                // 发送文件大小到服务器

                dos.writeLong(file.length());



                // 创建缓冲区，用于批量读取和发送文件数据

                byte[] buffer = new byte[4096];

                int bytesRead;           // 每次读取的字节数

                long totalBytesSent = 0; // 已发送的总字节数

                long fileSize = file.length(); // 文件总大小

                long lastProgressUpdate = System.currentTimeMillis(); // 上次更新进度的时间



                System.out.println("开始上传文件: " + file.getName() + "，大小: " + fileSize + " 字节");



                // 循环读取文件数据并发送到服务器

                while ((bytesRead = fis.read(buffer)) != -1) {

                    // 将读取的数据写入输出流发送到服务器

                    dos.write(buffer, 0, bytesRead);

                    totalBytesSent += bytesRead;



                    // 每秒钟更新一次上传进度

                    long currentTime = System.currentTimeMillis();

                    if (currentTime - lastProgressUpdate > 1000) {

                        double progress = (double) totalBytesSent / fileSize * 100;

                        System.out.printf("上传进度: %.2f%%\n", progress);

                        lastProgressUpdate = currentTime;

                    }

                }



                // 刷新输出流，确保所有数据都已发送

                dos.flush();

                System.out.println("文件上传完成，大小: " + totalBytesSent + " 字节");



            } catch (IOException e) {

                System.out.println("上传过程中发生错误: " + e.getMessage());

                e.printStackTrace();

            }

        }

    }

}
